// markdown-it-wiki-image.js

const {getBasenameWithoutExt} = require("../../util/file");
const {generateSha1ByBasename} = require("../../util/hash");
const markdownItWikiImageEnhanced = (md, options = {}) => {
    // 可选：配置选项，例如自定义容器类名、图片路径前缀等
    const opts = Object.assign({
        containerClass: 'wiki-image',
        imagePathPrefix: '/images/' // 可以为嵌入的图片路径添加前缀 //TODO: 没必要了，都是hash连接
    }, options);

    // 1. 语法解析：识别 ![[...]] 格式
    // 使用 markdown-it 的 inline 规则器来识别这种新格式
    md.inline.ruler.before('link', 'wiki_image', function wikiImageRule(state, silent) {
        const max = state.posMax;
        const pos = state.pos;

        // 快速检查：必须以 '![[' 开头
        if (state.src.charCodeAt(pos) !== 0x21 /* ! */ ||
            state.src.charCodeAt(pos+1) !== 0x5B /* [ */ ||
            state.src.charCodeAt(pos+2) !== 0x5B /* [ */) {
            return false;
        }

        // 查找结束标记 ']]'
        const end = state.src.indexOf(']]', pos + 3);
        if (end === -1) {
            return false; // 没有找到结束标记，不匹配
        }

        // 如果 silent 为 true，表示只是做验证，不实际添加 token
        if (silent) {
            return true;
        }

        // 提取文件名（'![[' 和 ']]' 之间的内容）
        const fileName = state.src.slice(pos + 3, end).trim();
        const fileNameWithoutExt = getBasenameWithoutExt(fileName); // TODO: 这里非常粗糙的将后面的#inline|300这类属性全去除了。

        // 创建 token 并添加到流水线中
        const token = state.push('wiki_image', '', 0);
        token.content = fileNameWithoutExt;
        // token.attrs = [['src', opts.imagePathPrefix + fileName]]; // 可以在这里处理路径
        token.attrs = [['src', `${generateSha1ByBasename(fileNameWithoutExt)}`]]; // 可以在这里处理路径

        // 移动解析位置到结束标记之后
        state.pos = end + 2; // 跳过两个 ']'

        return true;
    });

    // 2. 渲染器：定义如何将 wiki_image token 转换为 HTML
    md.renderer.rules.wiki_image = function(tokens, idx, options, env, self) {
        const token = tokens[idx];
        const fileName = token.content;
        // 默认使用 token.attrs 中的 src，如果没有则使用 content 并添加前缀
        let srcValue = (token.attrs && token.attrs.length > 0) ? token.attrs[0][1] : (opts.imagePathPrefix + fileName);

        // 构建最终的 HTML img 标签
        // 您可以在这里添加其他属性，如 class, alt 等
        const imgAttrs = {
            src: srcValue,
            alt: fileName, // alt 属性通常设置为文件名或您希望的内容
            // 可以添加 loading="lazy" 用于懒加载 [1,2](@ref)
            loading: 'lazy'
        };

        // 如果需要，可以包裹在一个 div 中以便更好地控制样式
        const containerOpen = opts.containerClass ? `<div class="${opts.containerClass}">` : '';
        const containerClose = opts.containerClass ? `</div>` : '';

        // 将属性对象转换为 HTML 字符串
        let attrStr = '';
        for (const [key, value] of Object.entries(imgAttrs)) {
            attrStr += ` ${key}="${md.utils.escapeHtml(value)}"`;
        }

        const imgTag = `<img${attrStr}>`;

        return containerOpen + imgTag + containerClose;
    };
}

module.exports = markdownItWikiImageEnhanced;